Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_crash_recovery.py

Displaying Raw • Download


tests/backend/test_crash_recovery.py massive-changes (a914d68e) Text, 4.42 KB

Tff7b72import T7ee787io
Tff7b72import T7ee787os
Tff7b72import T7ee787shutil
Tff7b72import T7ee787sqlite3
Tff7b72import T7ee787sys
Tff7b72import T7ee787tempfile
Tff7b72import T7ee787unittest

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787recoveryT7ee787.T7ee787crash_recovery Tff7b72import Te6edf3CrashRecovery


Tff7b72class T56d364TestCrashRecoveryTb4b4b4(Te6edf3unittestTff7b72.Td2a8ffTestCaseTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffsetUpTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftest_dir Tff7b72= Te6edf3tempfileTff7b72.Td2a8ffmkdtempTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstorage_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8fftest_dirTb4b4b4, Ta5d6ff"Ta5d6ffstorageTa5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_dirTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdb_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_dirTb4b4b4, Ta5d6ff"Ta5d6fftest.dbTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpublic_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8fftest_dirTb4b4b4, Ta5d6ff"Ta5d6ffpublicTa5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpublic_dirTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpublic_dirTb4b4b4, Ta5d6ff"Ta5d6ffindex.htmlTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6fftestTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffrecovery Tff7b72= Te6edf3CrashRecoveryTb4b4b4(
Te6edf3storage_dirTff7b72=Tff7b72selfTff7b72.Td2a8ffstorage_dirTb4b4b4,
Te6edf3database_pathTff7b72=Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4,
Te6edf3public_dirTff7b72=Tff7b72selfTff7b72.Td2a8ffpublic_dirTb4b4b4,
Tb4b4b4)

Tff7b72def Td2a8fftearDownTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3shutilTff7b72.Td2a8ffrmtreeTb4b4b4(Tff7b72selfTff7b72.Td2a8fftest_dirTb4b4b4)

Tff7b72def Td2a8fftest_diagnosis_normalTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e# Create a valid DB
Te6edf3conn Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3connTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffCREATE TABLE test (id INTEGER PRIMARY KEY)Ta5d6ff"Tb4b4b4)
Te6edf3connTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)

Te6edf3output Tff7b72= Te6edf3ioTff7b72.Td2a8ffStringIOTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrecoveryTff7b72.Td2a8ffrun_diagnosisTb4b4b4(Te6edf3fileTff7b72=Te6edf3outputTb4b4b4)
Te6edf3report Tff7b72= Te6edf3outputTff7b72.Td2a8ffgetvalueTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffassertInTb4b4b4(Ta5d6ff"Ta5d6ffOS:Ta5d6ff"Tb4b4b4, Te6edf3reportTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertInTb4b4b4(Ta5d6ff"Ta5d6ffPython:Ta5d6ff"Tb4b4b4, Te6edf3reportTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertInTb4b4b4(Ta5d6ff"Ta5d6ffStorage Path:Ta5d6ff"Tb4b4b4, Te6edf3reportTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertInTb4b4b4(Ta5d6ff"Ta5d6ffIntegrity: OKTa5d6ff"Tb4b4b4, Te6edf3reportTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertInTb4b4b4(Ta5d6ff"Ta5d6ffFrontend Status: Assets verifiedTa5d6ff"Tb4b4b4, Te6edf3reportTb4b4b4)

Tff7b72def Td2a8fftest_diagnosis_missing_storageTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3shutilTff7b72.Td2a8ffrmtreeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_dirTb4b4b4)
Te6edf3output Tff7b72= Te6edf3ioTff7b72.Td2a8ffStringIOTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrecoveryTff7b72.Td2a8ffrun_diagnosisTb4b4b4(Te6edf3fileTff7b72=Te6edf3outputTb4b4b4)
Te6edf3report Tff7b72= Te6edf3outputTff7b72.Td2a8ffgetvalueTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertInTb4b4b4(Ta5d6ff"Ta5d6ff[ERROR] Storage path does not existTa5d6ff"Tb4b4b4, Te6edf3reportTb4b4b4)

Tff7b72def Td2a8fftest_diagnosis_corrupt_dbTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffnot a sqlite databaseTa5d6ff"Tb4b4b4)

Te6edf3output Tff7b72= Te6edf3ioTff7b72.Td2a8ffStringIOTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrecoveryTff7b72.Td2a8ffrun_diagnosisTb4b4b4(Te6edf3fileTff7b72=Te6edf3outputTb4b4b4)
Te6edf3report Tff7b72= Te6edf3outputTff7b72.Td2a8ffgetvalueTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertInTb4b4b4(Ta5d6ff"Ta5d6ff[ERROR] Database is unreadableTa5d6ff"Tb4b4b4, Te6edf3reportTb4b4b4)

Tff7b72def Td2a8fftest_diagnosis_missing_frontendTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3shutilTff7b72.Td2a8ffrmtreeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpublic_dirTb4b4b4)
Te6edf3output Tff7b72= Te6edf3ioTff7b72.Td2a8ffStringIOTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrecoveryTff7b72.Td2a8ffrun_diagnosisTb4b4b4(Te6edf3fileTff7b72=Te6edf3outputTb4b4b4)
Te6edf3report Tff7b72= Te6edf3outputTff7b72.Td2a8ffgetvalueTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertInTb4b4b4(Ta5d6ff"Ta5d6ff[ERROR] Frontend directory is missingTa5d6ff"Tb4b4b4, Te6edf3reportTb4b4b4)

Tff7b72def Td2a8fftest_diagnosis_rns_missing_configTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3rns_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8fftest_dirTb4b4b4, Ta5d6ff"Ta5d6ffrns_missingTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrecoveryTff7b72.Td2a8ffupdate_pathsTb4b4b4(Te6edf3reticulum_config_dirTff7b72=Te6edf3rns_dirTb4b4b4)
Te6edf3output Tff7b72= Te6edf3ioTff7b72.Td2a8ffStringIOTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrecoveryTff7b72.Td2a8ffrun_diagnosisTb4b4b4(Te6edf3fileTff7b72=Te6edf3outputTb4b4b4)
Te6edf3report Tff7b72= Te6edf3outputTff7b72.Td2a8ffgetvalueTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertInTb4b4b4(Ta5d6ff"Ta5d6ff[ERROR] Reticulum config directory does not existTa5d6ff"Tb4b4b4, Te6edf3reportTb4b4b4)

Tff7b72def Td2a8fftest_diagnosis_rns_log_extractionTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3rns_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8fftest_dirTb4b4b4, Ta5d6ff"Ta5d6ffrns_logTa5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3rns_dirTb4b4b4)
Te6edf3log_file Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3rns_dirTb4b4b4, Ta5d6ff"Ta5d6fflogfileTa5d6ff"Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3log_fileTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffLine 1Tffea00\nTa5d6ffLine 2Tffea00\nTa5d6ffERROR: Something went wrongTffea00\nTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffrecoveryTff7b72.Td2a8ffupdate_pathsTb4b4b4(Te6edf3reticulum_config_dirTff7b72=Te6edf3rns_dirTb4b4b4)
Te6edf3output Tff7b72= Te6edf3ioTff7b72.Td2a8ffStringIOTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrecoveryTff7b72.Td2a8ffrun_diagnosisTb4b4b4(Te6edf3fileTff7b72=Te6edf3outputTb4b4b4)
Te6edf3report Tff7b72= Te6edf3outputTff7b72.Td2a8ffgetvalueTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertInTb4b4b4(Ta5d6ff"Ta5d6ffRecent Log EntriesTa5d6ff"Tb4b4b4, Te6edf3reportTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertInTb4b4b4(Ta5d6ff"Ta5d6ff> [ALERT] ERROR: Something went wrongTa5d6ff"Tb4b4b4, Te6edf3reportTb4b4b4)

Tff7b72def Td2a8fftest_env_disableTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffenvironTb4b4b4[Ta5d6ff"Ta5d6ffMESHCHAT_NO_CRASH_RECOVERYTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ff1Ta5d6ff"
Te6edf3recovery Tff7b72= Te6edf3CrashRecoveryTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertFalseTb4b4b4(Te6edf3recoveryTff7b72.Td2a8ffenabledTb4b4b4)
Tff7b72del Te6edf3osTff7b72.Td2a8ffenvironTb4b4b4[Ta5d6ff"Ta5d6ffMESHCHAT_NO_CRASH_RECOVERYTa5d6ff"Tb4b4b4]

Tff7b72def Td2a8fftest_handle_exception_formatTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e# We don't want to actually sys.exit(1) in tests, so we mock it
Te6edf3original_exit Tff7b72= Te6edf3sysTff7b72.Td2a8ffexit
Te6edf3sysTff7b72.Td2a8ffexit Tff7b72= Tff7b72lambda Te6edf3xTb4b4b4: Tff7b72None

Te6edf3output Tff7b72= Te6edf3ioTff7b72.Td2a8ffStringIOTb4b4b4(Tb4b4b4)
T8b949e# Redirect stderr to our buffer
Te6edf3original_stderr Tff7b72= Te6edf3sysTff7b72.Td2a8ffstderr
Te6edf3sysTff7b72.Td2a8ffstderr Tff7b72= Te6edf3output

Tff7b72tryTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffSimulated error for testingTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149ValueErrorTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrecoveryTff7b72.Td2a8ffhandle_exceptionTb4b4b4(Tff7b72*Te6edf3sysTff7b72.Td2a8ffexc_infoTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72finallyTb4b4b4:
Te6edf3sysTff7b72.Td2a8ffstderr Tff7b72= Te6edf3original_stderr
Te6edf3sysTff7b72.Td2a8ffexit Tff7b72= Te6edf3original_exit

Te6edf3report Tff7b72= Te6edf3outputTff7b72.Td2a8ffgetvalueTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertInTb4b4b4(Ta5d6ff"Ta5d6ff!!! APPLICATION CRASH DETECTED !!!Ta5d6ff"Tb4b4b4, Te6edf3reportTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertInTb4b4b4(Ta5d6ff"Ta5d6ffType: ValueErrorTa5d6ff"Tb4b4b4, Te6edf3reportTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertInTb4b4b4(Ta5d6ff"Ta5d6ffMessage: Simulated error for testingTa5d6ff"Tb4b4b4, Te6edf3reportTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertInTb4b4b4(Ta5d6ff"Ta5d6ffRecovery Suggestions:Ta5d6ff"Tb4b4b4, Te6edf3reportTb4b4b4)


Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Te6edf3unittestTff7b72.Td2a8ffmainTb4b4b4(Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────